package net.huashitong.service.sys;

import net.huashitong.mapper.sys.SsSysBasMapper;
import net.huashitong.ssydt.PaginationResult;
import net.huashitong.ssydt.exceptions.ParamErrorServiceException;
import net.huashitong.ssydt.exceptions.ServiceException;
import net.huashitong.ssydt.sys.entity.SsSysBas;
import net.huashitong.ssydt.sys.entity.vo.SsSysBasNewTypeVO;
import net.huashitong.ssydt.sys.entity.vo.SsSysBasQueryInVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * @author huiyang.yu
 */
@Service
@Transactional
public class SsSysBasServiceImpl implements SsSysBasService {

    private SsSysBasMapper ssSysBasMapper;

    @Autowired
    public SsSysBasServiceImpl(SsSysBasMapper ssSysBasMapper) {
        this.ssSysBasMapper = ssSysBasMapper;
    }

    @Override
    public List<SsSysBas> queryByBasType(String basType) {
        return this.ssSysBasMapper.queryByBasType(basType);
    }

    @Override
    public List<SsSysBas> queryNotTypeByBasType(String basType) {
        return this.ssSysBasMapper.queryNotTypeByBasType(basType);
    }

    @Override
    public List<SsSysBas> queryNotTypeByBasTypeAndAttr1(String basType, String attr1) {
        SsSysBas ssSysBas = new SsSysBas();
        ssSysBas.setBasType(basType);
        ssSysBas.setAttr1(attr1);
        return this.ssSysBasMapper.queryNotTypeByBasTypeAndAttr1(ssSysBas);
    }

    @Override
    public SsSysBas getByBasTypeAndDictValue(String basType, String dictValue) {
        SsSysBas ssSysBas = new SsSysBas();
        ssSysBas.setBasType(basType);
        ssSysBas.setDictValue(dictValue);
        ssSysBas = this.ssSysBasMapper.getByBasTypeAndDictValue(ssSysBas);
        return ssSysBas;
    }

    @Override
    public PaginationResult<SsSysBas> paginationQuery(SsSysBasQueryInVO ssSysBasQueryInVO) {
        PaginationResult result = new PaginationResult();
        result.setPageNumber(ssSysBasQueryInVO.getPageNumber());
        result.setPageSize(ssSysBasQueryInVO.getPageSize());

        // 查询记录总数
        int total = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
        result.setPageRecords(total);

        if (total == 0) {
            result.setList(new ArrayList());
        } else {
            // 查询当前页记录
            List<SsSysBas> list = ssSysBasMapper.query(ssSysBasQueryInVO);
            result.setList(list);
        }
        return result;
    }

    @Override
    public void addSysBas(SsSysBas ssSysBas) {
        checkParameters(ssSysBas);

        SsSysBasQueryInVO ssSysBasQueryInVO = new SsSysBasQueryInVO();
        ssSysBasQueryInVO.setBasType(ssSysBas.getBasType());
        ssSysBasQueryInVO.setDictValue(ssSysBas.getDictValue());
        int test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
        if (test != 0) {
            throw new ServiceException("系统参数已存在");
        }
        if (!"00".equals(ssSysBas.getDictValue())) {
            ssSysBasQueryInVO.setDictValue("00");
            test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
            if (test == 0) {
                throw new ServiceException("请先添加相关参数类型");
            }
        }
        ssSysBasMapper.insert(ssSysBas);
    }

    @Override
    public void updateSysBas(SsSysBas ssSysBas) {
        checkParameters(ssSysBas);

        SsSysBas raw = ssSysBasMapper.selectByPrimaryKey(ssSysBas.getId());
        if (raw == null) {
            throw new ServiceException("系统参数不存在");
        }

        // 当 isFixed 为 1 时禁止修改类型与字典值
        if (1 == raw.getIsFixed()) {
            ssSysBas.setBasType(raw.getBasType());
            ssSysBas.setDictValue(raw.getDictValue());
        }

        // 主类禁止修改字典值
        else if ("00".equals(raw.getDictValue())) {
            ssSysBas.setDictValue(raw.getDictValue());
        }

        // 子类禁止修改所属主类型
        else {
            ssSysBas.setBasType(raw.getBasType());
        }

        // 当修改了主类型或字典值时，判断新值是否已经存在于系统之中
        if (!raw.getBasType().equals(ssSysBas.getBasType()) || !raw.getDictValue().equals(ssSysBas.getDictValue())) {
            SsSysBasQueryInVO ssSysBasQueryInVO = new SsSysBasQueryInVO();
            ssSysBasQueryInVO.setBasType(ssSysBas.getBasType());
            ssSysBasQueryInVO.setDictValue(ssSysBas.getDictValue());
            int test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
            if (test != 0) {
                throw new ServiceException("系统参数已存在");
            }
        }

        ssSysBasMapper.updateByPrimaryKeySelective(ssSysBas);

        // 当修改主类型且主类型名称被修改时，同时修改子类（字典）的所属主类
        if ("00".equals(raw.getDictValue()) && !raw.getBasType().equals(ssSysBas.getBasType())) {
            SsSysBasNewTypeVO ssSysBasNewTypeVO = new SsSysBasNewTypeVO();
            ssSysBasNewTypeVO.setBasType(raw.getBasType());
            ssSysBasNewTypeVO.setNewBasType(ssSysBas.getBasType());
            ssSysBasMapper.updateBasType(ssSysBasNewTypeVO);
        }
    }

    @Override
    public void deleteSysBas(Long id) {
        SsSysBas ssSysBas = ssSysBasMapper.selectByPrimaryKey(id);
        if (ssSysBas == null) {
            return; // 不存在该条记录，默认为已删除
        }

        // "00" 为类型定义，删除类型之前必须先删除类型下的所属字典参数定义
        if ("00".equals(ssSysBas.getDictValue())) {
            SsSysBasQueryInVO ssSysBasQueryInVO = new SsSysBasQueryInVO();
            ssSysBasQueryInVO.setBasType(ssSysBas.getBasType());
            int test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
            if (test > 1) {
                throw new ServiceException("删除失败，请先删除该类型下的字典参数");
            }
        }

        ssSysBasMapper.deleteByPrimaryKey(id);
    }

    private void checkParameters(SsSysBas ssSysBas) {
        switch (ssSysBas.getIsFixed()) {
            case 0:
            case 1:
                break;
            default:
                throw new ParamErrorServiceException("是否固定输入参数错误");
        }
    }
}
